/**
*
*
*\author Isabel Martín Herrero 48539974 S
*
*
**/

#include <iostream>
#include "Figura2D.h"
#include "ExcepcionSVG.h"

#include <sstream>

/**
*\file Rectangulo.h
*\brief Archivo .h de la clase Rectangulo
*Archivo que contiene la declaración la clase Rectangulo
**/

using namespace std;

#ifndef _LEMUR_H_
#define _LEMUR_H_


/** \brief Clase Rectangulo
 *
 * La clase Rectangulo permite crear, destruir y modificar objetos de tipo Rectangulo.Un objeto Rectangulo sólamente tiene los atributos privados base, altura y origen
 * La clase Rectangulo es amiga de ostream, e hija de Figura2D
 */

class Rectangulo: public Figura2D 
{
	/** \brief Sobrecarga del operador de salida de la clase Rectangulo
	*
	* Función amiga. Emite por flujo de salida la representación en SVG de un rectángulo
	* \param os Objeto de tipo ostream 
	* \param r Objeto rectángulo 
	* \return Devuelve ostream &
	*/
	friend ostream& operator<<(ostream& os, const Rectangulo& r);

	private:	
		
		/** \brief Miembro base de la clase Rectangulo
		*
		* base, de tipo float. Contiene el valor de la base
		*/	
		float base;
		
		/** \brief Miembro altura de la clase Rectangulo
		*
		* altura, de tipo float. Contiene el valor de la altura
		*/
		float altura;
		
		
	public:
	
		/** \brief Constructor de la clase Rectangulo
		*
		* Crea un objeto de tipo rectángulo. Los valores por defecto son origen =0.0, base = 0.0, altura = 0.0 grosor=1 color=negro y color de linea=ninguno;
		*/
		Rectangulo(Coordenada = (0.0,0.0), float = 0.0, float = 0.0, int = 1, Color =black, Color =none);
		
		/** \brief Constructor de copia de la clase Rectangulo
		*
		* Crea un objeto de tipo Rectangulo a partir de otro que se le pasa por parámetro
		*
		*/
		Rectangulo(const Rectangulo&);
		
		/** \brief Destructor de la clase Rectangulo
		*
		* Libera toda la memoria ocupada por un objeto de tipo Rectangulo
		* 
		*/
		~Rectangulo();
		
		/** \brief Sobrecarga del operador de asignación de la clase Rectangulo
		*
		* Copia en el objeto que invoca al método los valores del que se le pasa como parámetro
		* \param r Objeto de tipo rectángulo 
		* \return Devuelve un objeto de tipo rectangulo (el invocador modificado)
		*/
		Rectangulo& operator=(const Rectangulo& r);
		
		/** \brief Método getBase de la clase Rectangulo
		*
		* Método que devuelve el dato miembro base
		* \return Devuelve un objeto de tipo float con el valor de la base
		*/
		float getBase()const {return base;};
		
		/** \brief Método getAltura de la clase Rectangulo
		*
		* Método que devuelve el dato miembro altura
		* \return Devuelve un objeto de tipo float con el valor de la altura
		*/
		float getAltura() const {return altura;};
		
		/** \brief Método setBase de la clase Rectangulo
		*
		* Método que cambia el valor de base por el que se le pasa por parámetros
		* \param b Valor que tomará base
		* \return Devuelve void
		*/
		void setBase(float b){ if(b>=0) base=b; else throw ExcepcionValorNoValido(b,"debe ser porsitivo o cero");};
		
		/** \brief Método setAltura de la clase Rectangulo
		*
		* Método que cambia el valor de altura por el que se le pasa por parámetros
		* \param a Valor que tomará base
		* \return Devuelve void
		*/
		void setAltura(float a){ if(a>=0) altura=a; else throw ExcepcionValorNoValido(a,"debe ser porsitivo o cero");};
		
		/** \brief Método pintar de la clase Rectangulo
		*
		* Emite por flujo de salida la representación en SVG de un rectángulo
		* \param os Objeto de tipo ostream 
		* \return Devuelve void
		*/
		void pintar(ostream& os) const;
		
		/** \brief Método leeEntrada.
		*
		* Lee la procesa la entrada proporcionada;
		*/		
		void leeEntrada(istream& );
		
		/** \brief Método clonar.
		*
		* Crea un nuevo rectangulo
		*/
		Rectangulo* clonar() const;
		
		
		/** \brief Método duplicar.
		*
		* Crea un nuevo rectangulo
		*/
		Rectangulo* duplicar(const Coordenada& );

		
		/** \brief Método escalar.
		*
		* Escala la figura
		*/
		void escalar(float=100.0);
};

#endif
